home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 2
/
Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso
/
Aminet
/
misc
/
amag
/
sh9302a.lha
/
Splines (S.31)
/
Spline.asm
< prev
next >
Wrap
Assembly Source File
|
1988-01-20
|
13KB
|
941 lines
anzahl = 6 ; Anzahl der Knoten (min. 4)
mulfaktor = 100
mulfak = 5 ; Genauigkeitsfaktor
x_links = 1 ; min. 1
x_rechts = 10 ; min. 1
y_oben = 5 ; min. 1
y_unten = 1 ; min. 1
y_delta = 240/(y_oben+y_unten)
x_delta = 620/(x_rechts+x_links)
y_achse = y_delta*y_oben
x_achse = x_delta*x_links
AllocMem = -198
FreeMem = -210
Forbid = -132
Permit = -138
OpenLibrary = -552
CloseLibrary = -414
RawDoFmt = -522
Write = -48
Output = -60
breite = 88
bs = breite*312
move.l 4.w,a6
move.l #Copper_Ende-sprite+5*bs,d0
move.l #$10002,d1
jsr AllocMem(a6)
move.l d0,copperBase
beq Ende
add.l #Copper_Ende-sprite,d0
move.l d0,bild
add.l #2*bs,d0
move.l d0,bild2
lea Copper(pc),a1
move d0,6(a1)
swap d0
move d0,2(a1)
swap d0
add.l #bs,d0
lea punkte(pc),a0
moveq #anzahl-1,d7
Int_pk: move.l d0,(a0)
addq.l #6,a0
dbra d7,Int_pk
move d0,14(a1)
swap d0
move d0,10(a1)
swap d0
add.l #bs,d0
move d0,22(a1)
swap d0
move d0,18(a1)
move.l copperBase,d0
move d0,30(a1)
swap d0
move d0,26(a1)
swap d0
lea sprite(pc),a1
move.l d0,a0
move #Copper_Ende-sprite-1,d7
Copy: move.b (a1)+,(a0)+
dbra d7,Copy
jsr Forbid(a6)
lea $dff000,a6
bsr Init
move.l copperBase,d0
add.l #Copper-sprite,d0
move #$3e0,$96(a6)
move.l d0,$80(a6)
clr $88(a6)
move #%1000001111100000,$96(a6)
lea mulu88(pc),a0
move.l bild2,a4
lea 978(a4),a5
moveq #0,d0
moveq #100,d1
move #624,d2
moveq #100,d3
bsr Line
bsr Koordinatensystem
lea x+4(pc),a0
lea y+4(pc),a1
moveq #anzahl-1,d7
move #624*mulfak,d6
divu d7,d6
moveq #4*mulfak,d5
Tab: move.l d5,(a0)+
add d6,d5
move.l #100*mulfak,(a1)+
dbra d7,Tab
Wait_Rt:move.l 4(a6),d0
and.l #$000fff00,d0
cmp.l #$00000f00,d0
bne.s Wait_Rt
btst #10,$16(a6)
bne NoModify
move #800*mulfak,d2
move maus+2(pc),d0
sub #124,d0
mulu #2*mulfak,d0
lea x+4(pc),a0
lea y(pc),a1
move.l d0,d3
move #anzahl-1,d7
Approx: move.l (a0)+,d1
sub d1,d0
bpl.s Positiv
neg d0
Positiv:cmp d0,d2
bmi.s Found
move d0,d2
move d3,d0
addq.l #4,a1
dbra d7,Approx
sub #2*mulfak,d3
bra.s Last
Found: subq.l #4,a0
add #2*mulfak,d3
cmp.l (a0),d3
bpl NoSprite
sub #4*mulfak,d3
Last: cmp.l -8(a0),d3
bmi NoSprite
sub #2*mulfak,d3
move.l d3,-(a0)
move maus(pc),d0
sub #57,d0
mulu #mulfak,d0
subq #2,d0
move d0,2(a1)
move #mulfak*mulfaktor,d4
bsr MakeSpline
lea $dff000,a6
lea bild(pc),a0
move.l (a0)+,a4
move.l (a0),d1
move.l a4,(a0)
move.l d1,-(a0)
move.l a4,a5
bsr ClearPic
lea x+4*anzahl(pc),a0
move.l (a0),d0
Draw: move.l d0,-(sp)
move #mulfak*mulfaktor,d1
bsr Funktionswert ; y-Wert in d1
divu #mulfak,d1
move.l (sp),d0
move.l d0,d4
divu #mulfak,d0
ext.l d0
lea lineto(pc),a1
move (a1)+,d2
move (a1)+,d3
move d1,-(a1)
move d0,-(a1)
tst d1
bmi.s NoLine
cmp #245,d1
bpl.s NoLine
tst d3
bmi.s NoLine
cmp #245,d3
bpl.s NoLine
cmp.l x+4*anzahl(pc),d4
beq.s NoLine
lea mulu88(pc),a0
lea 978(a4),a5
bsr Line
NoLine: move.l (sp)+,d0
sub.l #3*mulfak,d0
cmp.l x+4(pc),d0
bge.s Draw
lea punkte(pc),a0
moveq #anzahl-1,d7
Clr_pk: move (a0)+,d0
move.l (a0)+,a1
bclr d0,(a1)
dbra d7,Clr_pk
lea mulu88(pc),a0
lea x+4(pc),a1
lea y+4(pc),a2
lea punkte(pc),a3
moveq #anzahl-1,d7
Knoten: move.l (a1)+,d1
divu #mulfak,d1
move.l (a2)+,d2
divu #mulfak,d2
add d2,d2
lea bs+978(a4),a5
add (a0,d2.w),a5
move d1,d2
lsr #3,d2
lea (a5,d2.w),a5
moveq #15,d2
and.b d2,d1
not.b d1
bset d1,(a5)
move (a3),d0
move d1,(a3)+
move.l (a3),d1
move.l a5,(a3)+
move.l d1,a5
bclr d0,(a5)
dbra d7,Knoten
move.l copperBase,a0
lea Copper-sprite(a0),a0
move.l a4,d0
move d0,6(a0)
swap d0
move d0,2(a0)
swap d0
add.l #bs,d0
move d0,14(a0)
swap d0
move d0,10(a0)
NoModify:
lea $a(a6),a0
lea maus(pc),a2
move (a2)+,d1
move (a2)+,d0
cmp #126,d0
bpl.s Xmin
move #126,-2(a2)
bra.s NoMaus
Xmin: cmp #436,d0
bmi.s Xmax
move #435,-2(a2)
bra.s NoMaus
Xmax: cmp #57,d1
bpl.s Ymin
move #57,-4(a2)
bra.s NoMaus
Ymin: cmp #299,d1
bmi.s Ymax
move #298,-4(a2)
NoMaus: move (a0),(a2)
bra.s NoSprite
Ymax: move.b (a0)+,d1
sub.b (a2)+,d1
ext d1
add d1,-5(a2)
move.b (a0)+,d0
sub.b (a2)+,d0
ext d0
add d0,-4(a2)
move -(a0),-(a2)
move -(a2),d0
move -(a2),d1
moveq #0,d3
moveq #3,d2
move.l copperBase,a0
move.b d1,(a0)
btst #8,d1
beq.s noY
bset #2,d3
noY: add d2,d1
move.b d1,2(a0)
btst #8,d1
beq.s noZ
bset #1,d3
noZ: lsr #1,d0
bcc.s noX
bset #0,d3
noX: move.b d0,1(a0)
move.b d3,3(a0) ; Sprite setzen
NoSprite:
btst #6,$bfe001
bne Wait_Rt
move.l 4.w,a6
lea GrafikName(pc),a1
moveq #0,d0
jsr OpenLibrary(a6)
tst.l d0
beq.s NoGrafik
move.l d0,a1
lea $dff000,a5
move.l 38(a1),$80(a5)
clr $88(a5)
move #$8020,$96(a5)
jsr CloseLibrary(a6)
NoGrafik:
jsr Permit(a6)
move.l copperBase(pc),a1
move.l #Copper_Ende-sprite+5*bs,d0
jsr FreeMem(a6)
lea x+4(pc),a1
lea y+4(pc),a2
moveq #anzahl-1,d7
Change: move.l (a1),d0
sub #mulfak*x_achse,d0
muls #10*mulfaktor/mulfak,d0
divs #x_delta,d0
ext.l d0
move.l d0,(a1)+
move.l (a2),d0
neg d0
add #mulfak*y_achse,d0
muls #10*mulfaktor/mulfak,d0
divs #y_delta,d0
ext.l d0
move.l d0,(a2)+
dbra d7,Change
move #10*mulfaktor,d4
bsr MakeSpline
pea m(pc)
pea x(pc)
pea y(pc)
moveq #anzahl-2,d7
lea DosName(pc),a1
moveq #0,d0
move.l 4.w,a6
jsr OpenLibrary(a6)
move.l d0,a6
beq Ende
jsr Output(a6)
move.l d0,handle
Funktion:
move d7,-(sp)
addq.l #4,10(sp)
addq.l #4,6(sp)
addq.l #4,2(sp)
move.l 2(sp),a2
move.l 6(sp),a1
move.l 10(sp),a0
bsr Trans
lea koeffizient(pc),a0
move d0,(a0)+
move d3,(a0)+
move d5,(a0)+
move d4,(a0)+
move 2(a1),(a0)+
move 6(a1),(a0)
move d6,-(sp)
clr.l laenge
lea koeffizient(pc),a1
lea format(pc),a0
lea buffer(pc),a3
lea Routine(pc),a2
move.l 4.w,a5
jsr RawDoFmt(a5)
move (sp)+,d6
move.l laenge(pc),d3
lea buffer(pc),a0
Form: move.b (a0)+,d0
beq.s FormOk
cmp.b #"0",d0
bmi.s Form
cmp.b #"9",d0
bgt.s Form
lea -1(a0),a2
Zahl: cmp.b #"0",(a0)+
bmi.s Komma
cmp.b #"9",-1(a0)
ble.s Zahl
Komma: lea -1(a0),a1
move d6,d7
Stelle: cmp.b #" ",-(a1)
bne.s NoNull
move.b #"0",(a1)
NoNull: dbra d7,Stelle
move.l a2,a3
cmp.b #"-",-(a3)
bne.s Space
move.b #"0",(a3)
Sign: cmp.b #"+",-(a3)
bne.s Sign
move.b #"-",(a3)
Space: cmp.l a2,a1
bmi.s NoSpace
move.b (a2)+,-2(a2)
bra.s Space
NoSpace:move.b #".",-(a1)
cmp.b #" ",-(a1)
bne.s Form
move.b #"0",(a1)
bra.s Form
FormOk: move.l handle,d1
move.l #buffer,d2
jsr Write(a6)
move (sp)+,d7
dbra d7,Funktion
lea 12(sp),sp
move.l handle,d1
move.l #format2,d2
move.l #format3-format2,d3
jsr Write(a6)
pea m+2(pc)
clr -(sp)
moveq #anzahl-2,d7
Moment: move d7,-(sp)
addq.l #4,4(sp)
addq.w #1,2(sp)
clr.l laenge
lea koeffizient(pc),a1
move 2(sp),(a1)
move.l 4(sp),a0
move (a0),2(a1)
lea format3(pc),a0
lea buffer(pc),a3
lea Routine(pc),a2
move.l 4.w,a5
jsr RawDoFmt(a5)
move.l handle,d1
move.l #buffer,d2
move.l laenge(pc),d3
jsr Write(a6)
move (sp)+,d7
dbra d7,Moment
addq.l #6,sp
move.l a6,a1
move.l 4.w,a6
jsr CloseLibrary(a6)
mm: btst #10,$dff016
bne.s mm
Ende: clr.l d0
rts
Routine:move.b d0,(a3)+
addq.l #1,laenge
rts
Trans:
lea x2(pc),a3
lea y2(pc),a4
lea m2(pc),a5
moveq #1,d7
Move10: move.l (a0)+,d0
muls #10,d0
move.l d0,(a5)+
move.l (a1)+,d0
muls #10,d0
move.l d0,(a3)+
move.l (a2)+,d0
muls #10,d0
move.l d0,(a4)+
dbra d7,Move10
lea x2(pc),a1
lea y2(pc),a2
lea m2(pc),a0
move #100*mulfaktor,-(sp)
Over: move (sp),d0
ext.l d0
divu #10,d0
move d0,(sp)
move.l (a0),d0
divs #10,d0
ext.l d0
move.l d0,(a0)
move.l 4(a0),d0
divs #10,d0
ext.l d0
move.l d0,4(a0)
move.l (a1),d0
divs #10,d0
ext.l d0
move.l d0,(a1)
move.l 4(a1),d0
divs #10,d0
ext.l d0
move.l d0,4(a1)
move.l (a2),d0
divs #10,d0
ext.l d0
move.l d0,(a2)
move.l 4(a2),d0
divs #10,d0
ext.l d0
move.l d0,4(a2)
move.l (a0),d0
sub 6(a0),d0
muls (sp),d0
move.l (a1),d1
sub 6(a1),d1
divs d1,d0
ext.l d0
move.l (a1),d2
muls d0,d2
divs (sp),d2
move.l (a0),d3
sub d2,d3
asr #1,d3
divs #6,d0
move.l (a1),d2
move 6(a1),d4
add d4,d2
muls d1,d2
muls d4,d4
divs (sp),d2
move d2,d5
muls d3,d2
divs (sp),d4
bvs Over
add d4,d5
move d5,d6
muls 2(a1),d5
muls 6(a1),d4
divs (sp),d5
bvs Over
move d5,d7
divs (sp),d4
bvs Over
sub d4,d5
muls d0,d5
add.l d5,d2
move.l (a2),d5
sub 6(a2),d5
muls (sp),d5
sub.l d2,d5
divs d1,d5
move 2(a2),d1
muls (sp),d1
muls d0,d7
muls d3,d6
add.l d7,d6
move 2(a1),d7
muls d5,d7
move 2(a2),d4
muls (sp),d4
sub.l d6,d4
sub.l d7,d4
divs (sp),d4
move (sp)+,d7
moveq #-2,d6
Stell: addq #1,d6
ext.l d7
divu #10,d7
bne.s Stell
rts
ClearPic:
btst #14,2(a6)
bne.s ClearPic
move.l a5,$54(a6)
clr $66(a6)
move.l #$1000000,$40(a6)
move #300*64+44,$58(a6)
rts
maus: dc.w 152,285,0
Init:
btst #14,2(a6)
bne.s Init
move #-1,$72(a6)
move.l #-1,$44(a6)
move #breite,$60(a6)
move #$8000,$74(a6)
move #255,d7
lea mulu88(pc),a0
moveq #0,d0
mlo: move d0,(a0)+
add #breite,d0
dbf d7,mlo
rts
mulu88: dcb.w 256,0
MakeSpline:
lea x(pc),a0
lea y(pc),a1
lea 4(a0),a4
moveq #anzahl-2,d7
lea delta(pc),a2
lea 4(a2),a3
Loop: move.l 4(a4),d0
sub.l (a4)+,d0
move.l d0,(a3)+
dbf d7,Loop
lea delta2+8(pc),a3
lea 4(a0),a4
lea 8(a1),a5
addq.l #4,a2
lea alpha+8(pc),a6
moveq #anzahl-3,d7
Loop2: move.l 8(a4),d0
sub.l (a4)+,d0
add.l d0,d0
move.l d0,(a3)+
move.l 4(a5),d0
sub.l (a5),d0
move.l 4(a2),d1
muls d4,d0
divs d1,d0
ext.l d0
move.l (a5)+,d1
sub.l -8(a5),d1
move.l (a2)+,d2
muls d4,d1
divs d2,d1
ext.l d1
sub.l d1,d0
add.l d0,d0
move.l d0,d1
add.l d0,d0
add.l d1,d0
move.l d0,(a6)+
dbf d7,Loop2
lea m(pc),a6
clr.l (a6)
clr.l 4*anzahl(a6)
lea alpha+8(pc),a0
lea delta+8(pc),a1
lea delta2+8(pc),a2
moveq #anzahl-4,d7
Loop3: move.l (a0)+,d0
move.l (a1)+,d1
move.l (a2)+,d2
muls d1,d0
divs d2,d0
ext.l d0
sub.l d0,(a0)
muls d1,d1
divs d2,d1
ext.l d1
sub.l d1,(a2)
dbf d7,Loop3
lea alpha+anzahl*4(pc),a0
lea delta+anzahl*4(pc),a1
lea delta2+anzahl*4(pc),a2
lea m+anzahl*4(pc),a3
moveq #anzahl-3,d7
Loop4: move.l -(a0),d0
move.l -(a1),d1
move.l -(a2),d2
move.l (a3),d3
muls d3,d1
muls d4,d0
sub.l d1,d0
divs d2,d0
ext.l d0
move.l d0,-(a3)
dbf d7,Loop4
rts
Funktionswert:
move d1,-(sp)
lea x+8(pc),a0
lea y(pc),a1
lea delta(pc),a2
lea m(pc),a3
Suchen: addq.l #4,a1
addq.l #4,a2
addq.l #4,a3
cmp.l (a0)+,d0
bgt.s Suchen
move.l (a1)+,d1
move.l (a2),d2
move.l (a3)+,d3
sub.l -8(a0),d0
muls (sp),d0
divs d2,d0
ext.l d0
move.l (a1),d4
move.l (a3),d5
muls d0,d4
moveq #0,d6
move (sp),d6
sub.l d0,d6
muls d6,d1
add.l d4,d1
muls d2,d2
divs (sp),d2
ext.l d2
move.l d0,d4
muls d0,d0
divs (sp),d0
ext.l d0
muls d4,d0
muls (sp),d4
sub.l d4,d0
divs (sp),d0
ext.l d0
muls d0,d5
move.l d6,d4
muls d6,d6
divs (sp),d6
ext.l d6
muls d4,d6
muls (sp),d4
sub.l d4,d6
divs (sp),d6
ext.l d6
muls d6,d3
add.l d5,d3
divs (sp),d3
ext.l d3
muls d3,d2
moveq #1,d3
moveq #6,d0
Again: divs d0,d2
bvc.s NoError
mulu #10,d0
mulu #10,d3
bra.s Again
NoError:ext.l d2
muls d3,d2
add.l d2,d1
divs (sp),d1
ext.l d1
addq.l #2,sp
rts
Koordinatensystem:
lea bs+978(a4),a3
lea bs(a3),a3
moveq #0,d0
move #y_achse,d1
move d1,d3
move #620,d2
move.l a3,a5
bsr Line
move #x_achse,d0
move d0,d2
moveq #0,d1
move #240,d3
move.l a3,a5
bsr Line
move #x_delta,d0
moveq #0,d1
move #y_delta,d2
X_Punkt:moveq #0,d3
Y_Punkt:move d3,d4
add d4,d4
move.l a3,a5
add (a0,d4.w),a5
move d1,d4
move d1,d5
lsr #3,d4
lea (a5,d4.w),a5
moveq #15,d4
and.b d4,d5
not.b d5
bset d5,(a5)
add d2,d3
cmp #240,d3
ble.s Y_Punkt
add d0,d1
cmp #620,d1
ble.s X_Punkt
rts
Line: cmp d1,d3
bgt.s nohi
exg d0,d2
exg d1,d3
nohi: move d0,d4
move d1,d5
add d5,d5
add (a0,d5.w),a5
lsr #4,d4
add d4,d4
lea (a5,d4.w),a5
sub d0,d2
sub d1,d3
moveq #15,d5
and.l d5,d0
move d0,d4
ror.l #4,d0
eor d5,d4
moveq #0,d5
bset d4,d5
move #4,d0
tst d2
bpl.s l1
addq.w #1,d0
neg d2
l1: cmp d2,d3
ble.s l2
exg d2,d3
subq.w #4,d0
add d0,d0
l2: move d3,d4
sub d2,d4
add d4,d4
add d4,d4
add d3,d3
moveq #0,d6
move d3,d6
sub d2,d6
bpl.s l3
moveq #16,d1
or d1,d0
l3: add d3,d3
add d0,d0
add d0,d0
addq.w #1,d2
lsl #6,d2
addq.w #2,d2
swap d3
move d4,d3
or.l #$0bca0001,d0
wbl: btst #14,2(a6)
bne.s wbl
move.l d3,$62(a6)
move d6,$52(a6)
move.l a5,$48(a6)
move.l a5,$54(a6)
move.l d0,$40(a6)
move d2,$58(a6)
rts
lineto: dc.w 0,0
punkte: dcb.w 3*anzahl,0
y: dcb.l anzahl+1,0
delta: dcb.l anzahl+1,0
delta2: dcb.l anzahl+1,0
alpha: dcb.l anzahl+1,0
m: dcb.l anzahl+1,0 ; Momente
x: dcb.l anzahl+1,0
x2: dc.l 0,0
y2: dc.l 0,0
m2: dc.l 0,0
laenge: dc.l 0
buffer: dcb.w 50,0
koeffizient: dcb.w 7,0
copperBase: dc.l 0
bild: dc.l 0
bild2: dc.l 0
handle: dc.l 0
format: dc.b "s(x) = +%7dx",179,"+%7dx",178,"+%7dx+%7d, "
dc.b "+%7d<= x >=+%7d",10,0
format2:dc.b 10,"Spline - Momente:",10,0
format3:dc.b "m[%d] = %5d / 1000",10,0
DosName: dc.b "dos.library",0
GrafikName: dc.b "graphics.library",0
EVEN
sprite: dc.l 0
dc.w %0010000000000000,0
dc.w %0101000000000000,0
dc.w %0010000000000000,0
dc.l 0
Copper: dc.w $e0,0,$e2,0,$e4,0,$e6,0,$e8,0,$ea,0
dc.w $120,0,$122,0
dc.w $100,$b200,$108,0
dc.w $8e,$3081,$90,$30c1,$92,$28,$94,$d0
dc.w $180,0,$182,$f,$184,$f00,$186,$f00,$1a2,$f00
dc.w $188,$f0,$18a,$f,$18c,$f00,$18e,$f00
dc.w $124,0,$126,0,$128,0,$12a,0,$12c,0,$12e,0,$130,0
dc.w $132,0,$134,0,$136,0,$138,0,$13a,0,$13c,0,$13e,0
dc.l -2
Copper_Ende: